#include "Matrix.h"
#include <string.h>


CMatrix::CMatrix()
{
	m[0] = m[5] = m[10] = m[15] = 1;
	m[1] = m[2] = m[3] = m[4] = m[6] = m[7] = m[8] = m[9] = m[11]= m[12] = m[13] = m[14] = 0;
}


CMatrix::CMatrix( float *mat )
{
	memcpy( m, mat, 16 * sizeof( float ) );
}


CVector	CMatrix::operator * ( CVector v )
{
	CVector v2;

	v2.x = m[0] * v.x + m[4] * v.y + m[8] * v.z + m[12];
	v2.y = m[1] * v.x + m[5] * v.y + m[9] * v.z + m[13];
	v2.z = m[2] * v.x + m[6] * v.y + m[10] * v.z + m[14];

	return v2;
}


CMatrix CMatrix::operator * ( CMatrix mat )
{
	CMatrix ret;

	ret.m[0] = m[0] * mat[0] + m[4] * mat[1] + m[8] * mat[2] + m[12] * mat[3];
	ret.m[1] = m[0] * mat[4] + m[4] * mat[5] + m[8] * mat[6] + m[12] * mat[7];
	ret.m[2] = m[0] * mat[8] + m[4] * mat[9] + m[8] * mat[10] + m[12] * mat[11];
	ret.m[3] = m[0] * mat[12] + m[4] * mat[13] + m[8] * mat[14] + m[12] * mat[15];

	ret.m[4] = m[1] * mat[0] + m[5] * mat[1] + m[9] * mat[2] + m[13] * mat[3];
	ret.m[5] = m[1] * mat[4] + m[5] * mat[5] + m[9] * mat[6] + m[13] * mat[7];
	ret.m[6] = m[1] * mat[8] + m[5] * mat[9] + m[9] * mat[10] + m[13] * mat[11];
	ret.m[7] = m[1] * mat[12] + m[5] * mat[13] + m[9] * mat[14] + m[13] * mat[15];

	ret.m[8] = m[2] * mat[0] + m[6] * mat[1] + m[10] * mat[2] + m[14] * mat[3];
	ret.m[9] = m[2] * mat[4] + m[6] * mat[5] + m[10] * mat[6] + m[14] * mat[7];
	ret.m[10] = m[2] * mat[8] + m[6] * mat[9] + m[10] * mat[10] + m[14] * mat[11];
	ret.m[11] = m[2] * mat[12] + m[6] * mat[13] + m[10] * mat[14] + m[14] * mat[15];

	ret.m[12] = m[3] * mat[0] + m[7] * mat[1] + m[11] * mat[2] + m[15] * mat[3];
	ret.m[13] = m[3] * mat[4] + m[7] * mat[5] + m[11] * mat[6] + m[15] * mat[7];
	ret.m[14] = m[3] * mat[8] + m[7] * mat[9] + m[11] * mat[10] + m[15] * mat[11];
	ret.m[15] = m[3] * mat[12] + m[7] * mat[13] + m[11] * mat[14] + m[15] * mat[15];

	return ret;
}


CMatrix::operator float*()
{
	return m;
}


float CMatrix::MaxScale()
{
	float fMaxScale = m[0];

	if( m[5] > fMaxScale )
		fMaxScale = m[5];

	if( m[10] > fMaxScale )
		fMaxScale = m[10];
	
	return fMaxScale;
}